package com.balad.services;

import java.io.StringReader;
import java.util.ArrayList;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import com.balad.entities.*;

public class DataXMLServices {

	Ville maVille;
    ArrayList<POI> ListeEntitiesPOI;
	
    public DataXMLServices() {
		super();
	}
    
	public void chargerXMLVilleEnMemoire (String XMLVille, Ville maville) {
		// Cette fonction permet de charger l'arbre d'objet d'une ville.
		// routine de chargement de la ville et de ses enfants
		// (parser le xml)
		
		this.maVille = maville;
        this.ListeEntitiesPOI = new ArrayList<POI>();
        
        setPOIS(XMLVille);
        setVille(XMLVille);
        setItineraires(XMLVille);
        setThemes(XMLVille);
        setEvenements(XMLVille);
	}
	
	public void analyseXMLListeVilles (String XMLVilles, ArrayList<VilleAccueil> Liste) {
		// Cette fonction permet d'analyser le XML de liste des villes
		// et de retourner une liste de ville et si elle est locale (mes villes)
		// ou distante (parser le xml)
		
		ArrayList<VilleAccueil> ListeEntitiesVilleAccueil = Liste;
		
    	NodeList ElementsVilles = getXMLXpathNodesList("/VILLES/VILLE", XMLVilles);
    	NodeList ElementsEnfants;
    	Node ElementEnfant;
    	String tagName;
    	for (int i=0;i<ElementsVilles.getLength();i++){
    		VilleAccueil laVilleAccueil = new VilleAccueil();
    		ListeEntitiesVilleAccueil.add(laVilleAccueil);
        	Node ElementVilleAccueil = ElementsVilles.item(i);
        	ElementsEnfants = ElementVilleAccueil.getChildNodes();
        	for (int j=0;j<ElementsEnfants.getLength();j++){
        		ElementEnfant = ElementsEnfants.item(j);
        		tagName = ElementEnfant.getNodeName();
                if (tagName.equalsIgnoreCase("IDVILLE")){
                	laVilleAccueil.setId_ville(Integer.parseInt(ElementEnfant.getTextContent()));
                } else if (tagName.equalsIgnoreCase("NOMVILLE")){
                	laVilleAccueil.setNom(ElementEnfant.getTextContent());
                }  else if (tagName.equalsIgnoreCase("VERSION")){
                	laVilleAccueil.setVersion(Integer.parseInt(ElementEnfant.getTextContent()));
                } else if (tagName.equalsIgnoreCase("ISLOCALEVILLE")){
                	boolean isLocale;
                	if (ElementEnfant.getTextContent().equals("non")){
                		isLocale = false;
                	} else {
                		isLocale = true;
                	}
                	laVilleAccueil.setIs_locale(isLocale);
                }
        	}
    	}
	}
	
    private NodeList getXMLXpathNodesList(String expression, String XMLString){
    	StringReader sr = new StringReader(XMLString); 
    	InputSource inputSrc = new InputSource(sr); 
		 // query XPath instance, this is the parser
		XPath xpath = XPathFactory.newInstance().newXPath();
		 // list of nodes queried
		 try {
			NodeList nodes = (NodeList)xpath.evaluate(expression, inputSrc, XPathConstants.NODESET);
			return nodes;
		} catch (XPathExpressionException e) {
			e.printStackTrace();
			return null;
		}
    }

    private void setVille (String XMLString){
    	NodeList ElementsVilles = getXMLXpathNodesList("/VILLE", XMLString);
    	Node ElementVille = ElementsVilles.item(0);
    	NodeList ElementsEnfants = ElementVille.getChildNodes();
    	Node ElementEnfant;
    	String tagName;
    	for (int j=0;j<ElementsEnfants.getLength();j++){
    		ElementEnfant = ElementsEnfants.item(j);
    		tagName = ElementEnfant.getNodeName();
            if (tagName.equalsIgnoreCase("IDVILLE")){
            	this.maVille.setId_ville(Integer.parseInt(ElementEnfant.getTextContent()));
            } else if (tagName.equalsIgnoreCase("NOM")){
            	this.maVille.setTitre(ElementEnfant.getTextContent());
            } else if (tagName.equalsIgnoreCase("CP")){
            	this.maVille.setCP(ElementEnfant.getTextContent());
            } else if (tagName.equalsIgnoreCase("DEPARTEMENT")){
            	this.maVille.setDepartement(ElementEnfant.getTextContent());
            } else if (tagName.equalsIgnoreCase("DESCRIPTION")){
            	this.maVille.setDescription(ElementEnfant.getTextContent());
            } else if (tagName.equalsIgnoreCase("LONGITUDE")){
            	this.maVille.setLongitude(Double.parseDouble(ElementEnfant.getTextContent()));
            } else if (tagName.equalsIgnoreCase("LATITUDE")){
            	this.maVille.setLatitude(Double.parseDouble(ElementEnfant.getTextContent()));
            } else if (tagName.equalsIgnoreCase("PHOTO")){
            	this.maVille.addMediaPhoto(setMedia(ElementEnfant,0));
            }
    	}
    }
    
    private void setPOIS (String XMLString){
    	NodeList ElementsPOIS = getXMLXpathNodesList("/VILLE/POI", XMLString);
    	NodeList ElementsEnfants;
    	Node ElementEnfant;
    	String tagName;
    	for (int i=0;i<ElementsPOIS.getLength();i++){
    		POI lePOI = new POI();
    		this.ListeEntitiesPOI.add(lePOI);
        	Node ElementPOI = ElementsPOIS.item(i);
        	ElementsEnfants = ElementPOI.getChildNodes();
        	for (int j=0;j<ElementsEnfants.getLength();j++){
        		ElementEnfant = ElementsEnfants.item(j);
        		tagName = ElementEnfant.getNodeName();
                if (tagName.equalsIgnoreCase("IDPOI")){
                	lePOI.setId_poi(Integer.parseInt(ElementEnfant.getTextContent()));
                } else if (tagName.equalsIgnoreCase("NOM")){
                	lePOI.setTitre(ElementEnfant.getTextContent());
                } else if (tagName.equalsIgnoreCase("DESCRIPTION")){
                	lePOI.setDescription(ElementEnfant.getTextContent());
                } else if (tagName.equalsIgnoreCase("LONGITUDE")){
                	lePOI.setLongitude(Double.parseDouble(ElementEnfant.getTextContent()));
                } else if (tagName.equalsIgnoreCase("LATITUDE")){
                	lePOI.setLatitude(Double.parseDouble(ElementEnfant.getTextContent()));
                } else if (tagName.equalsIgnoreCase("PHOTO")){
                	lePOI.addMediaPhoto(setMedia(ElementEnfant,0));
                }
        	}
    	}
    }

    private void setItineraires (String XMLString){
    	NodeList ElementsItineraires = getXMLXpathNodesList("/VILLE/ITINERAIRE", XMLString);
    	NodeList ElementsEnfants;
    	Node ElementEnfant;
    	String tagName;
    	for (int i=0;i<ElementsItineraires.getLength();i++){
    		Itineraire leItineraire = new Itineraire();
    		this.maVille.addItineraire(leItineraire);
        	Node ElementItineraire = ElementsItineraires.item(i);
        	ElementsEnfants = ElementItineraire.getChildNodes();
        	for (int j=0;j<ElementsEnfants.getLength();j++){
        		ElementEnfant = ElementsEnfants.item(j);
        		tagName = ElementEnfant.getNodeName();
                if (tagName.equalsIgnoreCase("IDITINERAIRE")){
                	leItineraire.setId_itineraire(Integer.parseInt(ElementEnfant.getTextContent()));
                } else if (tagName.equalsIgnoreCase("NOM")){
                	leItineraire.setTitre(ElementEnfant.getTextContent());
                } else if (tagName.equalsIgnoreCase("DESCRIPTION")){
                	leItineraire.setDescription(ElementEnfant.getTextContent());
                } else if (tagName.equalsIgnoreCase("VOITURE")){
                	boolean voiture;
                	if (ElementEnfant.getTextContent() == "0"){
                		voiture = false;
                	} else {
                		voiture = true;
                	}
                	leItineraire.setVoiture(voiture);
                } else if (tagName.equalsIgnoreCase("TEMPS")){
                	leItineraire.setTemps(ElementEnfant.getTextContent());
                } else if (tagName.equalsIgnoreCase("DISTANCE")){
                	leItineraire.setDistance(ElementEnfant.getTextContent());
                } else if (tagName.equalsIgnoreCase("PHOTO")){
                	leItineraire.addMediaPhoto(setMedia(ElementEnfant,0));
                } else if (tagName.equalsIgnoreCase("IDPOI")){
                	int idpoi = Integer.parseInt(ElementEnfant.getTextContent());
                	int k=0;
                	while (this.ListeEntitiesPOI.get(k).getId_poi() != idpoi)
                	{
                		k++;
                	}
                	leItineraire.addPOI(this.ListeEntitiesPOI.get(k));
                }
        	}
    	}
    }
    
    private void setThemes (String XMLString){
    	NodeList ElementsThemes = getXMLXpathNodesList("/VILLE/THEME", XMLString);
    	NodeList ElementsEnfants;
    	Node ElementEnfant;
    	String tagName;
    	for (int i=0;i<ElementsThemes.getLength();i++){
    		Theme leTheme = new Theme();
    		this.maVille.addTheme(leTheme);
        	Node ElementTheme = ElementsThemes.item(i);
        	ElementsEnfants = ElementTheme.getChildNodes();
        	for (int j=0;j<ElementsEnfants.getLength();j++){
        		ElementEnfant = ElementsEnfants.item(j);
        		tagName = ElementEnfant.getNodeName();
                if (tagName.equalsIgnoreCase("IDTHEME")){
                	leTheme.setId_theme(Integer.parseInt(ElementEnfant.getTextContent()));
                } else if (tagName.equalsIgnoreCase("NOM")){
                	leTheme.setTitre(ElementEnfant.getTextContent());
                } else if (tagName.equalsIgnoreCase("DESCRIPTION")){
                	leTheme.setDescription(ElementEnfant.getTextContent());
                } else if (tagName.equalsIgnoreCase("PHOTO")){
                	leTheme.addMediaPhoto(setMedia(ElementEnfant,0));
                } else if (tagName.equalsIgnoreCase("IDPOI")){
                	int idpoi = Integer.parseInt(ElementEnfant.getTextContent());
                	int k=0;
                	while (this.ListeEntitiesPOI.get(k).getId_poi() != idpoi)
                	{
                		k++;
                	}
                	leTheme.addPOI(this.ListeEntitiesPOI.get(k));
                }
        	}
    	}
    }

    private void setEvenements (String XMLString){
    	NodeList ElementsEvenement = getXMLXpathNodesList("/VILLE/EVENEMENT", XMLString);
    	NodeList ElementsEnfants;
    	Node ElementEnfant;
    	String tagName;
    	for (int i=0;i<ElementsEvenement.getLength();i++){
    		Evenement leEvenement = new Evenement();
    		this.maVille.addEvenement(leEvenement);
        	Node ElementEvenement = ElementsEvenement.item(i);
        	ElementsEnfants = ElementEvenement.getChildNodes();
        	for (int j=0;j<ElementsEnfants.getLength();j++){
        		ElementEnfant = ElementsEnfants.item(j);
        		tagName = ElementEnfant.getNodeName();
                if (tagName.equalsIgnoreCase("IDEVENEMENT")){
                	leEvenement.setId_Evenement(Integer.parseInt(ElementEnfant.getTextContent()));
                } else if (tagName.equalsIgnoreCase("NOM")){
                	leEvenement.setTitre(ElementEnfant.getTextContent());
                } else if (tagName.equalsIgnoreCase("DATE")){
                	leEvenement.setDate(ElementEnfant.getTextContent());
                } else if (tagName.equalsIgnoreCase("DESCRIPTION")){
                	leEvenement.setDescription(ElementEnfant.getTextContent());
                } else if (tagName.equalsIgnoreCase("PHOTO")){
                	leEvenement.addMediaPhoto(setMedia(ElementEnfant,0));
                }
        	}
    	}
    }
    
    private Media setMedia(Node leNode, int type){
    	Media leMedia = new Media();
    	NodeList ElementsEnfants = leNode.getChildNodes();
		Element node = (Element)leNode;
		leMedia.setOrdre(Integer.parseInt(node.getAttribute("ordre")));
		leMedia.setType(type);
    	String tagName;
    	Node ElementEnfant;
    	for (int i=0;i<ElementsEnfants.getLength();i++){
    		ElementEnfant = ElementsEnfants.item(i);
    		tagName = ElementEnfant.getNodeName();
    		if (tagName.equalsIgnoreCase("NOM")){
            	leMedia.setNom(ElementEnfant.getTextContent());
            } else if (tagName.equalsIgnoreCase("URL")){
            	leMedia.setFile(ElementEnfant.getTextContent());
            } else if (tagName.equalsIgnoreCase("TAILLE")){
            	leMedia.setTaille(Integer.parseInt(ElementEnfant.getTextContent()));
            } else if (tagName.equalsIgnoreCase("ISLOCALE")){
            	boolean isLocale;
            	if (ElementEnfant.getTextContent() == "oui"){
            		isLocale = true;
            	} else {
            		isLocale = false;
            	}
            	leMedia.setIslocale(isLocale);
            }
    	}
    	return leMedia;
    }
    
	public void getMedia(String XMLVille, ArrayList<Media> listeMedia) {
//    	NodeList ElementsMedias = getXMLXpathNodesList("/VILLE/descendant::PHOTO", XMLVille);
//    	Node ElementMedia;
//    	String toto = "debut";
//    	
//    	for (int i=0;i<ElementsMedias.getLength();i++){
//        	ElementMedia = ElementsMedias.item(i);
//        	listeMedia.add(setMedia(ElementMedia,0));
//    	}
//    	toto = "milieu";
//    	
//    	for (int i=0;i<listeMedia.size();i++){
//    		for (int j=0; j<listeMedia.size();j++) {
//    			if (i != j && listeMedia.get(i).getFile().equals(listeMedia.get(j).getFile())){
//    				listeMedia.remove(j);
//    			}
//    		}
//    	}
//    	toto = "fin";
	}

}
